using System;
using System.Data;
using System.Collections.Generic; //Aca esta el tipo de dato lista
using nmspDataWEB;
using nmspLIBROENINVENTARIO;

namespace nmspUSUARIO
{
    public class Usuario
    {
        private Database db_conexion = new Database(); //objeto que maneja las bases de datos

        private System.Guid id;
        private string nombre;
        private string email;

        //***************************************************************************************
        //Funcion privada que retorna la cantidad total de usuarios 
        public int cantidadDeUsuarios()
        {
            int cantidaddeusuarios =0;
            DataTable dttable = new DataTable();
            string sql;

            sql = "Select 1 ";
            sql += "FROM aspnet_Users INNER JOIN ";
            sql += "aspnet_Membership ON aspnet_Users.UserId = aspnet_Membership.UserId ";
            //creo un tipo de dato tabla con el resultado del select 
            dttable = db_conexion.GetDataTable(sql);

            DataRow[] dtr = dttable.Select();

            foreach (DataRow row in dtr)
            {
                cantidaddeusuarios += cantidaddeusuarios;
            }

            return cantidaddeusuarios;
        }

        //***************************************************************************************
        //Funcion privada que retorna todos los usuarios en un tipo de datos
        //de tabla
        private DataTable leerTodosLosUsuarios()
        {
            DataTable dttable = new DataTable();
            string sql;

            //debo saber si existe la editorial
            //FALTA TRatar el error de nulo cuando lea una dato que no tiene valor!!!!
            sql = "Select aspnet_Users.UserId, aspnet_Users.UserName, aspnet_Membership.Email AS UserEmail ";
            sql += "FROM aspnet_Users INNER JOIN ";
            sql += "aspnet_Membership ON aspnet_Users.UserId = aspnet_Membership.UserId ";
            //creo un tipo de dato tabla con el resultado del select 
            dttable = db_conexion.GetDataTable(sql);

            return dttable;
        }

        private void leerUsuarioPorId(System.Guid pid)
        {
            DataTable dttable = new DataTable();
            string sql;

            //debo saber si existe la editorial
            //FALTA TRatar el error de nulo cuando lea una dato que no tiene valor!!!!
            sql = "Select aspnet_Users.UserId, aspnet_Users.UserName, aspnet_Membership.Email AS UserEmail ";
            sql +="FROM aspnet_Users INNER JOIN ";
            sql +="aspnet_Membership ON aspnet_Users.UserId = aspnet_Membership.UserId ";
            sql +="WHERE aspnet_Users.UserId=" + pid;
            //creo un tipo de dato tabla con el resultado del select 
            dttable = db_conexion.GetDataTable(sql);

            DataRow[] dtr = dttable.Select();

            foreach (DataRow row in dtr)
            {
                this.id = (System.Guid)row["UserId"];
                this.nombre = (string)row["UserName"];
                this.email = row["UserEmail"].ToString();
            }
        }

        private void leerUsuarioPorNombre(string pnombre)
        {
            DataTable dttable = new DataTable();
            string sql;

            //debo saber si existe la editorial
            //FALTA TRatar el error de nulo cuando lea una dato que no tiene valor!!!!
            //sql = "Select aspnet_Users.UserId, aspnet_Users.UserName, '' as UserEmail from aspnet_Users Where aspnet_Users.UserName='" + pnombre + "'";
            sql = "SELECT aspnet_Users.UserId, aspnet_Users.UserName, aspnet_Membership.Email AS UserEmail ";
            sql += "FROM  aspnet_Users INNER JOIN ";
            sql += "aspnet_Membership ON aspnet_Users.UserId = aspnet_Membership.UserId ";
            sql += "WHERE (aspnet_Users.UserName = '" + pnombre + "')";
            //creo un tipo de dato tabla con el resultado del select 
            dttable = db_conexion.GetDataTable(sql);

            DataRow[] dtr = dttable.Select();

            foreach (DataRow row in dtr)
            {
                this.id = (System.Guid)row["UserId"];
                this.nombre = (string)row["UserName"];
                this.email = row["UserEmail"].ToString();
            }
        }

        ~Usuario()
        {
        }

        public Usuario()
        { }

        public Usuario(System.Guid pid)
        {
            //Si construye la clase solo con el id 
            //se busca toda la informacion restante
            //automaticamente
            leerUsuarioPorId(pid);
        }

        public Usuario(string pnombre)
        {
            //Si construye la clase solo con el nombre 
            //se busca toda la informacion restante
            //automaticamente
            leerUsuarioPorNombre(pnombre);
        }

        public Usuario(System.Guid pid, string pnombre, string pmail)
        {
            id = pid;
            nombre = pnombre;
            email = pmail;
        }

        public void setEmail(string p_email)
        {
            email = p_email;
        }

        public string getEmail()
        {
            return email;
        }

        public System.Guid getUserId()
        {
            return this.id;
        }

        public string getNombre()
        {
            return this.nombre;
        }

        public List<Usuario> getTodosLosUsuarios()
        {
            DataTable dttable = new DataTable();
            List<Usuario> lista = new List<Usuario>();

            dttable = leerTodosLosUsuarios();
            //Vuelco el resultado al tipo de datos rows 
            DataRow[] dtr = dttable.Select();

            foreach (DataRow row in dtr)
            {
                this.id = (System.Guid)row["UserId"];
                this.nombre = (string)row["UserName"];
                this.email = row["UserEmail"].ToString();

                //Se agregar un nuevo tipo de objeto usuario a la lista
                lista.Add(new Usuario(this.id, this.nombre, this.email));
            }

            //retorna la lista con todos los usuarios que haya leido
            return lista;
        }

        public void saveEmailToDb(string p_email)
        {
            string sql;

            sql = "UPDATE aspnet_Membership SET Email='" + p_email + "' WHERE UserId= '" + this.id.ToString() + "'";
            int res = db_conexion.ejecutarStatement(sql);
            if(res > 0)
                setEmail(p_email);
   
        }

        //*********************************************************************
        //Retorna una lista de objetos libro en invetario 
        //Cada USUARIO sabe los libros que tiene en su inventario
        //*********************************************************************
        public List<nmspLIBROENINVENTARIO.LibroEnInventario> getListaDeLibros()
        {
            DataTable dttable = new DataTable();
            List<nmspLIBROENINVENTARIO.LibroEnInventario> ListaLibros = new List<nmspLIBROENINVENTARIO.LibroEnInventario>();
            int id_aux;
            string sql;

            //Solo los id de libros de este usuario 
            //ordenados por titulo del libro
            sql = "SELECT tblLibros.Id ";
            sql += "FROM tblLibros ";
            sql += "WHERE cast (UserId as varchar(40)) = '" + this.id + "' ";
            sql += "ORDER BY tblLibros.Titulo ";


            //creo un tipo de dato tabla con el resultado del select 
            dttable = db_conexion.GetDataTable(sql);
            //Vuelco el resultado al tipo de datos rows 
            DataRow[] dtr = dttable.Select();

            foreach (DataRow row in dtr)
            {
                //Solo traigo el id
                id_aux = System.Convert.ToInt32(row["id"].ToString());
                //Creo la clase con el constructor de id y se agrega a la lista
                ListaLibros.Add(new LibroEnInventario(id_aux));
            }

            return ListaLibros;
        }


    }
}//namespace nmspUSUARIO